﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.Filters;

namespace D.UtilCore.Filters
{
    /// <summary>
    /// 授权过滤器，要去注册使用，否则无效
    /// </summary>
    public class ExtAuthorizationFilter : IAuthorizationFilter  //IAuthorizationFilter:权限过滤器
    {
        public void OnAuthorization(AuthorizationFilterContext context)
        {
            //可以访问在应用程序启动时注册的各种服务和依赖项（：获取数据库上下文、日志记录器、身份验证服务等）
            var container = context.HttpContext.RequestServices;

            //any表示有任何一个满足就返回true，all表示全部都满足才返回true
            //如果所有元素的类型都不是 授权属性就返回true  
            if (context.ActionDescriptor.EndpointMetadata.All(x => !x.GetType().Equals(typeof(AuthorizeAttribute))))
            {
                return;
            }

            //如果存在任何一个元素的类型等于 允许匿名属性 就返回true  
            if (context.ActionDescriptor.EndpointMetadata.Any(x => x.GetType().Equals(typeof(AllowAnonymousAttribute))))
            {
                return;
            }

            //var userRoleRep = container.GetService<IBaseRespository<UserRole>>(); //用户角色表
            //var rolePermRep = container.GetService<IBaseRespository<RolePerm>>(); //角色权限表
            //var permissionRep = container.GetService<IBaseRespository<Perm>>();     //权限表

            ////获取当前请求路径
            //var path = context.HttpContext.Request.Path;
            ////1、获取当前用户3
            //var principal = context.HttpContext.User;
            //var claims = principal.FindFirst("userId");
            //if (claims != null)
            //{
            //    var userid = int.Parse(claims.Value);
            //    //2.获取当前用户下的角色
            //    var userRoleIds = userRoleRep.GetAll().Where(m => m.UserId == userid).ToList().Select(m => m.RoleId).ToArray();
            //    //3.获取当前用户下角色的所有权限
            //    var permissionIds = rolePermRep.GetAll().Where(m => userRoleIds.Contains(m.RoleId)).ToList().Select(m => m.PermId).ToArray();
            //    var permissions = permissionRep.GetAll().Where(m => permissionIds.Contains(m.PermId)).ToList();

            //    //4.根据权限判断当前用户访问的资源在不在权限列表中
            //    var hasPermision = permissions.Any(m => m.ActionName.Equals(path));
            //    if (!hasPermision)
            //    {
            //        //context.Result = new ForbidResult();  //这种用在服务器端，直接返回http的code401
            //        //以下用于前后端分离下返回前端数据，让前端来处理提示异常信息
            //        context.Result = new ObjectResult(new ResulrWapper
            //        {
            //            code = 401,
            //            message = "访问被拒绝"
            //        });
            //    }
            //}
        }
    }
}
